home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldbmp08 / ldbmp08s.lzh / GXPUT.S < prev    next >
Text File  |  1997-03-06  |  3KB  |  91 lines

  1. *********************************************************************************
  2. *    拡大縮小表示  Oh!X 1991/08 P119 GXPUT.S 改                *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.  
  8.     .xdef    _Gxput
  9.  
  10. *描画先頭アドレス
  11. *描画レングスX
  12. *      Y
  13. *パターン先頭アドレス
  14. *パターン横長さ
  15. *パターン縦長さ
  16. *パターン1ライン分のバイト数
  17. *ワークアドレス
  18.  
  19.     .text
  20.     .even
  21.  
  22. _Gxput:
  23. ARGPTR    =    4+6*4+7*4
  24.     movem.l    d0-d5/a0-a6,-(sp)
  25.     movea.l    ARGPTR(sp),a6        *a6 = 引数列
  26.  
  27.     movea.l    (a6)+,a0        *a0 = 描画先左上G-RAMアドレス
  28.  
  29.     movem.w    (a6)+,d2-d3        *d2 = 描画範囲の横ピクセル数-1
  30.     subq.w    #1,d2            *d3 = 描画範囲の縦ピクセル数-1
  31.     subq.w    #1,d3
  32.  
  33.     movea.l    (a6)+,a1        *a1 = パターン先頭アドレス
  34.  
  35.     movem.w    (a6)+,a2-a3        *a2 = パターン横ピクセル数-1
  36.     subq.l    #1,a2            *a3 = パターン縦ピクセル数-1
  37.     subq.l    #1,a3
  38.  
  39.     movea.w    (a6)+,a4        *a4 = パターン1ライン分バイト数
  40.  
  41.     movea.l    (a6)+,a6        *a6 = テーブル用ワーク
  42.  
  43.     move.w    d2,d0            *
  44.     neg.w    d0            *d0 = xについての誤差項初期値
  45.     bne    fix0            *描画先幅が1ピクセルしかない場合の
  46.     move.w    d0,a2            * つじつま合わせ
  47. fix0:    move.w    d2,d4            *d4 = xループカウンタ初期値
  48.     add.w    d2,d2            *d2 = xについての誤差項増分
  49.     add.w    a2,a2            *a2 = xについての誤差項補正値
  50.  
  51.     movea.l    a6,a5            *a5 = テーブル先頭アドレス
  52.     move.w    d4,d5            *d5 = xループカウンタ
  53. iloop:    moveq.l    #0,d1            *d1 = xの増分(0に初期化)
  54.     add.w    a2,d0            *xについての誤差を累積させる
  55.     ble    inext            *
  56. iinclp:    addq.w    #2,d1            *xの増分を増す
  57.     sub.w    d2,d0            *x誤差項を補正する
  58.     bgt    iinclp            *誤差項が0以下になるまで繰り返す
  59. inext:    move.w    d1,(a5)+        *テーブルに登録
  60.     dbra    d5,iloop        *横幅分繰り返す
  61.  
  62.     move.w    d3,d1            *
  63.     neg.w    d1            *d1 = yについての誤差項初期値
  64.     bne    fix1            *描画先高が1ピクセルしかない場合の
  65.     move.w    d1,a3            * つじつま合わせ
  66. fix1:    move.w    d3,d5            *d5 = yループカウンタ初期値
  67.     add.w    d3,d3            *d3 = yについての誤差項増分
  68.     add.w    a3,a3            *a3 = yについての誤差項補正値
  69.  
  70.     move.l    a6,d2            *d2 = テーブル先頭アドレス
  71. yloop:    movea.l    a0,a5            *a5 = 描画先
  72.     movea.l    a1,a6            *a6 = 参照元
  73.  
  74.     movea.l    d2,a2            *a2 = テーブル先頭アドレス
  75.     move.w    d4,d0            *d0 = xループカウンタ
  76. xloop:    move.w    (a6),(a5)+        *1ピクセル書き込む
  77.     adda.w    (a2)+,a6        *参照元x座標を進める
  78.     dbra    d0,xloop        *横幅分繰り返す
  79.  
  80.     add.w    a3,d1            *yについての誤差を累積させる
  81.     ble    ynext            *
  82. yinclp:    suba.l    a4,a1            *参照元y座標を進める(戻す)
  83.     sub.w    d3,d1            *y誤差項を補正する
  84.     bgt    yinclp            *誤差項が負になるまで繰り返す
  85.  
  86. ynext:    lea.l    512*2(a0),a0        *描画先y座標を進める
  87.     dbra    d5,yloop        *高さ分繰り返す
  88.  
  89. done:    movem.l    (sp)+,d0-d5/a0-a6
  90.     rts
  91.